Assessing Demographic and Case-Level Predictors of Exoneration Duration Using LME and GEE Models
1 Introduction
In all criminal prosecutions, the accused shall enjoy the right to a speedy and public trial by an impartial jury of the state and district wherein the crime shall have been committed, which district shall have been previously ascertained by law, and to be informed of the nature and cause of the accusation; to be confronted with the witnesses against him; to have compulsory process for obtaining witnesses in his favor, and to have the Assistance of Counsel for his defense (Constitution Annotated, n.d.). The Sixth Amendment provides critical protections for those accused of crimes. Yet, despite these safeguards, wrongful convictions persist, and the journey from false imprisonment to exoneration differs significantly, contradicting the amendment’s promise of prompt justice.
Former U.S. Senator Ted Stevens is a notable case of wrongful conviction. He was prosecuted and found guilty of alleged criminal ethics violations. His conviction was ultimately overturned when a whistleblower revealed that prosecutors had withheld crucial evidence that could have proved his innocence, thereby violating his constitutional rights. Although the time between his conviction and exoneration was less than a year, the damage was already done, costing him his bid for reelection and leaving a lasting negative stigma associated with the allegations (National Association of Criminal Defense Lawyers, 2022).
Similarly, LaCresha Murray’s story highlights the tragic consequences of wrongful convictions. Convicted in 1996 at just 11 years old, she became the youngest person ever to be convicted of murder in Travis County. She was sentenced to 20 years in a youth prison; however, her conviction was overturned in 1999 after a judge found that her confession had been obtained unlawfully by the police (Aldis, 2023).
Archie Williams’ case underscored significant injustices within the criminal justice system. Wrongfully convicted of rape at the age of 22 due to misidentification, he endured 37 years of incarceration. His long battle for justice, supported by the Innocence Project, culminated in a pivotal moment when a fingerprint found at the crime scene was linked to a serial rapist. This crucial evidence exonerated him, ultimately clearing him of all charges (Lahera, 2023).
The stories of exonerated individuals reveal a significant issue within the American legal system. Since 1989, over 3,000 people have been exonerated in the United States, having collectively spent more than 26,700 years in prison for crimes they did not commit. The reasons for these wrongful convictions are varied and include false confessions, misidentification by eyewitnesses, coerced testimony from informants, misapplication of scientific evidence, government misconduct, and inadequate legal representation.
Significant disparities also exist in the manner in which these wrongful convictions occur. For example, According to the National Registry of Exonerations, more than half of the 3,300 individuals exonerated between 1989 and 2022 are Black, despite Black people making up just 13.6% of the U.S. population. A 2022 report from the registry found that innocent Black individuals were seven times more likely to be wrongfully convicted of murder than innocent white individuals. This racial disproportionality in wrongful conviction cases highlights persistent biases within the criminal legal system (Innocence Project, 2023).
There is a limited understanding of how the timeline from conviction to exoneration varies among wrongfully convicted individuals in the U.S. since 1989, despite over 3,000 exonerations. This research project aims to investigate the impact of demographic factors (age, sex, and race) and crime characteristics (crime type and whether the case is state or federal) on exoneration timelines. We will also analyze trends at both the population and state levels, considering the clustered nature of cases and the longitudinal structure of the data. Understanding these patterns is essential for identifying systemic justice barriers and informing reforms to expedite the pursuit of justice.
2 Methods
2.1 Data and Methods
2.1.1 Data Source
Data for this study were obtained from the National Registry of Exonerations, a comprehensive repository that documents the exoneration of innocent criminal defendants and works to prevent future wrongful convictions. The original dataset contained information on 3,497 individuals, including demographic characteristics (name, age, and sex), geographic information, case details (crime type and sentence), and temporal data (conviction and exoneration dates) (National Registry of Exonerations, 2022).
2.1.2 Data Preparation and Variable Construction
The data preparation process involved several systematic steps to ensure analytical suitability:
2.1.2.1 Variable Selection
Key variables were selected for analysis, including age, sex, race, crime type, state, date of conviction, and date of exoneration.
2.1.2.2 Crime Type Recategorization
Original crime classifications were consolidated into six broader categories based on their legal nature and societal impact:
- Crimes Against Persons: Offenses causing harm or threat to individuals, including murder, assault, sexual offenses, and kidnapping
- Property Crimes: Offenses involving theft or property damage, such as burglary, arson, and possession of stolen goods
- Crimes Against Society: Offenses threatening societal order, including drug violations, weapons offenses, and immigration infractions
- White-Collar Crimes: Financial and non-violent offenses, encompassing fraud, bribery, tax evasion, and forgery
- Justice System Crimes: Offenses obstructing legal processes, such as perjury and official misconduct
- Other Crimes: Miscellaneous offenses not fitting the aforementioned categories
2.1.2.3 Jurisdiction Classification
Cases were classified into two jurisdictional categories: state and federal to facilitate analysis of legal framework differences and their potential impact on case outcomes and procedural variations.
2.1.2.4 Time-to-Exoneration Variable
A continuous variable measuring the duration (in years) from initial conviction to exoneration was calculated for each case.
2.1.2.5 Age Categorization
Preliminary exploratory analysis revealed a positively skewed age distribution, with the majority of individuals aged 20 years or older at the time of conviction. Consequently, age was categorized into discrete groups spanning from adolescence to older adulthood to better capture developmental and life-stage effects on exoneration duration.
Final Dataset
After data cleaning and variable construction, the analytical dataset comprised 3,4 cases in 11 variables. The reduction from 3,497 to 3,425 cases (1.3% attrition) resulted from the exclusion of records with missing or incomplete data essential for the primary analyses.
2.2 Exploratory Data Analysis
Exploratory data analysis is essential in any data-driven or statistical investigation, as it provides a comprehensive understanding of the distribution of each variable within a dataset. This process reveals patterns and trends, highlights associations, and uncovers unusual observations or anomalies.
Using the finalized dataset, we examined the information in both cross-sectional and longitudinal formats.
2.2.0.1 Cross-Sectional Exploratory Analysis
The cross-sectional exploratory analysis included several types of visualizations to examine the distribution and relationships among key variables:
Univariate
Histograms illustrating the age distribution of exonerees and the time taken for exoneration:
Bar plots depicting the distribution of race, sex, age group, jurisdiction, and crime type among exonerees.
Line graphs showing trends in the number of convictions and exonerations over the specified years.
A summary table providing numerical summaries of the various characteristics.
Bivariate
Stratified line graphs illustrating the time to exoneration across various demographic and crime characteristics.
Stratified bar charts displaying the distribution of crime types by age group, race, and sex.
Stratified violin plots representing the distribution of years until exoneration, segmented by age group, sex, race, and crime type.
Two heatmaps illustrating the number of exonerations in each state, as well as the average time to exoneration for those states.
These visualizations and tables reveal patterns associated with age, race, sex, crime type, and jurisdiction, offering valuable insights into the groups most affected by wrongful convictions.
2.2.0.2 Longitudinal Exploratory Analysis
To examine the longitudinal structure of the data, we developed several specialized visualizations:
Mean trajectory plots were constructed to visualize the average time to exoneration following an initial conviction since 1989. An overall mean trajectory plot, along with stratified plots, was created to examine the influence of various case and demographic characteristics on this pattern.
Spaghetti plots were employed to visually compare the trends in time to exoneration across different states in the United States since 1989. Furthermore, stratified plots were developed to explore how unique case-specific and demographic factors impact these trajectories.
State-specific trajectory plots were generated faceted by state for all 50 U.S. states. These plots highlight the within-state variability in the duration from initial conviction to exoneration, providing an in-depth analysis of the temporal aspects of the exoneration process across various jurisdictions.
These visualizations uncovered significant patterns in exoneration timelines, effectively addressing the clustered nature of the data and enriching our understanding of wrongful conviction trends within the United States justice system.
2.3 Statistical Analyses
To address the research objectives, we employed two approaches suitable for analyzing longitudinal and clustered data: the Linear Mixed Effects Model (LME) and the Generalized Estimating Equations (GEE) framework. These methods allowed us to assess both subject-specific and population-averaged effects, respectively (Fitzmaurice et al., 2011; Vanegas et al., 2023).
2.3.0.1 Linear Mixed Effects Model
The linear mixed effects model (LME) assumes that exoneration timelines depend on a combination of fixed effects (population-level parameters shared by all states) and state-specific random effects. This leads to a model for the marginal mean response averaged over the distribution of the random effects. The introduction of random effects induces covariance among exoneration cases within the same state (Fitzmaurice et al., 2011). Three common formulations of the linear mixed effects models were considered:
- Random Intercept Only: In this model, each state is assumed to have a unique underlying baseline level of response that persists over time. It estimates a unique intercept for each state in addition to overall population-level parameters.
\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + \beta_2\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij} \end{aligned} \]
This model describes the mean response trajectory over time for any state. \(U_{0i}\) is the state-specific random intercept that describes how the baseline level for the \(i^{th}\) state deviates from the population average (\(\beta_0\)), after the effects of the covariates have been accounted for.
- Random Intercept + Random Slope on (T) (Uncorrelated): This model estimates both a common intercept and slope, as well as state-specific intercepts and slopes, but assumes that the random intercept and slope are uncorrelated:
\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + (\beta_2 + U_{1i})\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij}\\ \end{aligned} \]
- Random Intercept + Random Slope on (T) (Correlated): This formulation is the same as Model 2 but allows the random intercept and slope to be correlated:
\[ \begin{aligned} Y_{ij} &= (\beta_0 + U_{0i}) + \beta_1\,X_{ij} + (\beta_2 + U_{1i})\,T_{ij} + \beta_3\,(X_{ij}\times T_{ij}) + \varepsilon_{ij},\\ \end{aligned} \]
All three models were fitted to address each research objective and subsequently compared using the Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC), and the likelihood ratio test. The Random Intercept + Random Slope (Uncorrelated) model consistently exhibited the best fit, reflected by the lowest AIC and BIC values, and was thus selected as the final model. To evaluate the significance of the main effects and interactions, Type III Wald chi-square tests were conducted using the car::Anova() function.
2.3.0.2 Generalized Estimating Equations
The Generalized Estimating Equations (GEE) method is a statistical technique for analyzing clustered or correlated data. Unlike mixed effects models, GEE focuses on estimating population-averaged effects rather than subject-specific impacts for individual clusters (Vanegas et al., 2023).
In our analysis, we initially employed an exchangeable working correlation structure, which assumes that all pairs of observations within each state have equal correlation, regardless of their temporal separation. We also explored alternative working correlation structures, including independence and autoregressive structures. Using model selection criteria. Specifically the Quasi-likelihood under Independence Criterion (QIC) and Correlation Information Criterion (CIC), we identified the structure with the lowest fit statistic. In this case, the exchangeable correlation structure provided the best fit to our data.
2.3.0.3 Model Specification
Each model included the following general marginal structure:
\[E[Y_{ij}|X_{ij}, T_{j}] = \beta_0 + \beta_1T_{j} + \beta_2X_{ij} + \beta_3T_{j}X_{ij}\]
Where:
- \(Y_{ij}\): Time to exoneration for state \(i\) in year \(j\)
- \(T_{j}\): Years since 1989 (baseline year)
- \(X_{ij}\): Covariate of interest for state \(i\) in year \(j\) (e.g., proportion of cases by sex, race, crime type, age group, or jurisdiction type)
- \(i\): Index for state (cluster), \(i = 1, 2, ..., 50\) (50 U.S. states)
- \(j\): Index for year within each state cluster, \(j = 1989, 1990, ..., 2024\)
Separate models were fit for each covariate. Wald tests were used to assess:
- \(\beta_1\): The main effect of time (overall temporal trends in time to exoneration)
- \(\beta_2\): The main effect of the covariate (differences in time to exoneration by covariate level)
- \(\beta_3\): The interaction between time and the covariate (whether temporal trends differ by covariate level)
3 Results
This section presents findings from exploratory data analysis and statistical assessments, showcasing them through various forms such as graphical representations, tables, and statistical models.
3.1 Exploratory Data Analysis:
3.1.1 Cross-sectional Structure
The quarto dashboard provided a comprehensive cross-sectional overview of the variables in the exoneration dataset. The visualizations were organized into three categories: Univariate distributions, Bivariate distributions and associations, and Trend visualizations. This structure allowed for effective analysis of the data. Notable observations include:
- The average time from initial conviction to exoneration was 12.2 years with the histogram being positively skewed.
- The average age of the exonerated individuals was 28.3 years with a positively skewed distribution.
- Males comprised the majority of exoneration cases (over 90%), with particularly high representation in person crimes (93%) and justice system crimes (94%).
- The 20-29 year old age group comprised the majority of exoneration cases (over 40%), with early adulthood (20-29) representing 45% of person crimes exonerations, and 46% of society crimes.
- Black individuals were disproportionately represented in exoneration cases, accounting for 53% of the total, with particularly high representation in society crimes (69%) and person crimes (52%).
- State cases comprised the majority of exonerations compared to federal cases, with nearly all person crimes exonerations (99%) occurring at the state level.
- Crimes against persons accounted for over 72% of exoneration cases, with 2,508 cases representing the largest category by far.
- Time to exoneration varied significantly by crime type, with person crimes taking the longest (14.34 years on average) and justice system crimes the shortest (4.10 years).
- White-collar crimes showed the highest proportion of white defendants (75%) and federal jurisdiction cases (69%). (Ikpea, 2024)
3.1.2 Longitudinal Structure
- Plot of Means:
Code
summary_crime_type <- longitudinal_data_clean |>
group_by(crime_type, years_since_1989) |>
summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")
highlight_crime <- summary_crime_type |>
group_by(crime_type) |>
filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
mutate(
label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
)
ggplot(summary_crime_type, aes(x = years_since_1989, y = mean_duration, group = crime_type, color = crime_type)) +
geom_line(linewidth = 1) +
geom_point(aes(shape = crime_type), size = 2) +
geom_label(
data = highlight_crime,
aes(label = label, fill = crime_type), # <-- Changed from type to sex
nudge_y = 0.5,
color = "white",
label.padding = unit(0.2, "lines"),
label.size = 0.3,
size = 3,
show.legend = FALSE
)+
labs(
title = "Mean Time from Conviction to Exoneration by Crime Type",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "bottom") +
scale_color_brewer(palette = "Paired")
summary_race <- longitudinal_data_clean |>
group_by(race, years_since_1989) |>
summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")
highlight_race <- summary_race |>
group_by(race) |>
filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
mutate(
label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
)
ggplot(summary_race, aes(x = years_since_1989, y = mean_duration, group = race, color = race)) +
geom_line(linewidth = 1) +
geom_point(aes(shape = race), size = 2) +
geom_label(
data = highlight_race,
aes(label = label, fill = race), # <-- Changed from type to sex
nudge_y = 0.5,
color = "white",
label.padding = unit(0.2, "lines"),
label.size = 0.3,
size = 3,
show.legend = FALSE
)+ labs(
title = "Mean Time from Conviction to Exoneration by Race",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "bottom") +
scale_color_brewer(palette = "Dark2")
summary_age <- longitudinal_data_clean |>
group_by(age_group, years_since_1989) |>
summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")
highlight_age <- summary_age |>
group_by(age_group) |>
filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
mutate(
label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
)
ggplot(summary_age, aes(x = years_since_1989, y = mean_duration, group = age_group, color = age_group)) +
geom_line(linewidth = 1) +
geom_point(aes(shape = age_group), size = 2) +
geom_label(
data = highlight_age,
aes(label = label, fill = age_group), # <-- Changed from type to sex
nudge_y = 0.5,
color = "white",
label.padding = unit(0.2, "lines"),
label.size = 0.3,
size = 3,
show.legend = FALSE
)+
labs(
title = "Mean Time from Conviction to Exoneration by Age Group",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) + theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "bottom") +
scale_color_brewer(palette = "Set1")
summary_jurisdiction <- longitudinal_data_clean |>
group_by(jurisdiction, years_since_1989) |>
summarize(mean_duration = mean(time_to_exoneration), .groups = "drop")
highlight_jurisdiction <- summary_jurisdiction |>
group_by(jurisdiction) |>
filter(mean_duration == min(mean_duration) | mean_duration == max(mean_duration)) |>
mutate(
label = paste0("Year: ", years_since_1989, "\nMean: ", round(mean_duration, 2))
)
ggplot(summary_jurisdiction, aes(x = years_since_1989, y = mean_duration, group = jurisdiction, color = jurisdiction)) +
geom_line(linewidth = 1) +
geom_point(aes(shape = jurisdiction), size = 2) +
geom_label(
data = highlight_jurisdiction,
aes(label = label, fill = jurisdiction), # <-- Changed from type to sex
nudge_y = 0.5,
color = "white",
label.padding = unit(0.2, "lines"),
label.size = 0.3,
size = 3,
show.legend = FALSE
)+
labs(
title = "Mean Time from Conviction to Exoneration by Jurisdiction",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 10) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "bottom") +
scale_color_brewer(palette = "Set2")- Spaghetti Plots:
Code
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by State",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none" # Hide overly busy legend
) +
scale_color_viridis_d(option = "C", begin = 0.2, end = 0.8)
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
facet_wrap(.~sex) +
geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by Sex",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none") +
scale_color_viridis_d(option = "B", begin = 0.2, end = 0.8)
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, color=corrected_state)) +
facet_wrap(.~race) + geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by Race",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none") +
scale_color_viridis_d(option = "C")
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
facet_wrap(.~age_group) + geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by Age Group",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none") +
scale_color_viridis_d(option = "D")
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
facet_wrap(.~crime_type) + geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by Crime Type",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none") +
scale_color_viridis_d(option = "E")
ggplot(longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state, colour = corrected_state)) +
facet_wrap(.~jurisdiction) + geom_line(alpha = 0.4, linewidth = 0.8) +
labs(
title = "Time from Conviction to Exoneration by Jurisdiction",
x = "Years Since 1989",
y = "Time from Conviction to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
legend.position = "none") +
scale_color_viridis_d(option = "F")- State-Specific Plots:
Code
ggplot(data = longitudinal_data_clean,
aes(x = years_since_1989, y = time_to_exoneration, group = corrected_state)) +
facet_wrap(. ~ corrected_state, ncol = 6) +
geom_line(alpha = 0.6, linewidth = 0.8, color = "#2D708EFF") +
geom_point(alpha = 0.6, color = "#2D708EFF", size = 0.8) +
labs(
title = "Time from Conviction to Exoneration by State",
x = "Years Since 1989",
y = "Time to Exoneration (Years)"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, size = 12),
strip.text = element_text(size = 8),
panel.spacing = unit(0.7, "lines")
)3.2 Statistical Analyses
This section highlights the results of the linear mixed effects model. For comparison, the generalized estimating equation results are provided in the Appendix.
3.2.1 Sex as Covariate of Interest
Code
# Extract fixed effects summary
fixed_effects_df <- as.data.frame(summary(mod_sex2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
# Get confidence intervals
ci <- nlme::intervals(mod_sex2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("CI Lower", "CI Upper")
# Combine results
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
kable(fixed_effects_full, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | CI Lower | CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.259 | 0.472 | 3396 | 9.023 | 0.000 | 3.334 | 5.184 |
| years_since_1989 | 0.357 | 0.027 | 3396 | 13.183 | 0.000 | 0.304 | 0.410 |
| sexFemale | -0.196 | 1.409 | 3396 | -0.139 | 0.889 | -2.956 | 2.565 |
| years_since_1989:sexFemale | -0.187 | 0.060 | 3396 | -3.129 | 0.002 | -0.305 | -0.070 |
Key Findings:
In 1989, the estimated average time from initial conviction to exoneration for males in the United States was 4.26 years. A significant main effect of time was observed, indicating that with each additional year since 1989, the estimated average time to exoneration for males increased by 0.36 years (95% CI: 0.30, 0.41; p < 0.001).
The main effect of sex was not statistically significant; females had an estimated average time to exoneration 0.20 years shorter than males in 1989, but this difference was not statistically significant (95% CI: -0.73, 0.32; p = 0.89). However, a significant interaction between sex and time indicated that the rate of change in the average exoneration time was 0.19 years slower per year for females compared to males (95% CI: -0.30, -0.07; p < 0.05).
3.2.2 Race as Covariate of Interest
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_race2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_race2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 5.270 | 0.630 | 3388 | 8.365 | 0.000 | 4.037 | 6.503 |
| years_since_1989 | 0.348 | 0.032 | 3388 | 10.888 | 0.000 | 0.286 | 0.411 |
| raceHispanic | -5.858 | 1.283 | 3388 | -4.565 | 0.000 | -8.369 | -3.346 |
| years_since_1989:raceHispanic | 0.180 | 0.054 | 3388 | 3.358 | 0.001 | 0.075 | 0.285 |
| years_since_1989:raceAsian | -0.545 | 0.242 | 3388 | -2.249 | 0.025 | -1.020 | -0.071 |
Key Findings (Significant Results Only):
In 1989, the estimated average time from initial conviction to exoneration for Black exonerees in the United States was 5.27 years. A significant main effect of time showed that this duration increased by 0.35 years for each additional year since 1989 (95% CI: 0.29, 0.41; p < 0.001).
A significant main effect of race indicated that Hispanic exonerees had a substantially shorter estimated average time to exoneration in 1989, 5.86 years less than that of Black exonerees (95% CI: -8.37, -3.35; p < 0.001).
Additionally, significant interaction effects between race and time were observed. Specifically, the estimated annual rate of change in the average exoneration time for Hispanic exonerees was 0.18 years greater than that for Black exonerees (95% CI: 0.08, 0.28; p < 0.05), whereas for Asian exonerees, the annual rate of change was 0.55 years less than that for Black exonerees (95% CI: -1.02, -0.07; p < 0.05).
3.2.3 Age Group as Covariate of Interest
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_age_group2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_age_group2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.985 | 0.615 | 3390 | 8.106 | 0.000 | 3.781 | 6.189 |
| years_since_1989 | 0.372 | 0.030 | 3390 | 12.325 | 0.000 | 0.313 | 0.431 |
| years_since_1989:age_groupAdolescence (15–19) | 0.148 | 0.046 | 3390 | 3.213 | 0.001 | 0.058 | 0.238 |
| years_since_1989:age_groupMid Adulthood (30–39) | -0.086 | 0.043 | 3390 | -2.005 | 0.045 | -0.169 | -0.002 |
| years_since_1989:age_groupOlder Adulthood (40+) | -0.237 | 0.048 | 3390 | -4.961 | 0.000 | -0.330 | -0.143 |
Key Findings (Significant Results Only):
In 1989, the estimated average time from initial conviction to exoneration for the 0–14 age group in the United States was 4.98 years. A significant main effect of time indicated that this duration increased by 0.37 years for each additional year since 1989 (95% CI: 0.31, 0.43; p < 0.001).
However, the main effect of age group was not statistically significant, as there was insufficient evidence to conclude that the average time to exoneration in 1989 differed across age groups (ANOVA p = 0.33).
Significant interaction effects between age group and time were observed. Specifically:
The annual rate of change in average exoneration time for the 15–19 age group was 0.15 years greater than that for the 0–14 age group (95% CI: 0.06, 0.24; p < 0.05),
The 30–39 age group showed a slightly slower rate of change, at 0.09 years less per year (95% CI: -0.17, -0.00; p = 0.045).
The 40+ age group experienced the slowest increase, with an annual rate of change 0.24 years less than that for the 0–14 age group (95% CI: -0.33, -0.14; p < 0.001).
3.2.4 Crime Type as Covariate of Interest
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_crime_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.452 | 0.431 | 3388 | 10.340 | 0.000 | 3.609 | 5.294 |
| years_since_1989 | 0.404 | 0.026 | 3388 | 15.682 | 0.000 | 0.353 | 0.454 |
| crime_typeSociety Crimes | -6.044 | 1.258 | 3388 | -4.802 | 0.000 | -8.507 | -3.580 |
| years_since_1989:crime_typeProperty Crimes | -0.209 | 0.094 | 3388 | -2.221 | 0.026 | -0.393 | -0.025 |
| years_since_1989:crime_typeWhite-collar Crimes | -0.310 | 0.116 | 3388 | -2.683 | 0.007 | -0.537 | -0.084 |
| years_since_1989:crime_typeSociety Crimes | -0.165 | 0.050 | 3388 | -3.308 | 0.001 | -0.262 | -0.067 |
| years_since_1989:crime_typeJustice System Crimes | -0.395 | 0.198 | 3388 | -1.991 | 0.047 | -0.782 | -0.007 |
Key Findings:
In 1989, the estimated average time from initial conviction to exoneration for crimes against people in the United States was 4.45 years. A significant main effect of time indicated that this duration increased by 0.40 years for each additional year since 1989 (95% CI: 0.35, 0.45; p < 0.001).
A significant main effect of crime type was observed. Specifically, in 1989, individuals convicted of society crimes had an estimated average exoneration time that was 6.04 years shorter than those convicted of crimes against people (95% CI: -8.51, -3.58; p < 0.001).
Additionally, significant interaction effects between crime type and time were identified. The annual rate of change in the average exoneration time for property crimes was 0.21 years less per year than for crimes against people (95% CI: -0.39, -0.03; p = 0.026), while white-collar crimes showed a rate 0.31 years less per year (95% CI: -0.54, -0.08; p = 0.007). Society crimes had an annual rate of change in the average exoneration time 0.17 years less per year than crimes against people (95% CI: -0.26, -0.07; p = 0.001), and justice system crimes showed the largest difference, with a rate 0.40 years less per year (95% CI: -0.78, -0.01; p = 0.047).
3.2.5 Jurisdiction Type as Covariate of Interest
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_jurisdiction_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_jurisdiction_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.433 | 0.487 | 3396 | 9.110 | 0.000 | 3.480 | 5.387 |
| years_since_1989 | 0.347 | 0.030 | 3396 | 11.634 | 0.000 | 0.288 | 0.405 |
| years_since_1989:jurisdictionFederal | -0.223 | 0.091 | 3396 | -2.444 | 0.015 | -0.402 | -0.044 |
Key Findings:
In 1989, the estimated average time from initial conviction to exoneration for state-level cases in the United States was 4.43 years. A significant main effect of time indicated that this duration increased by 0.35 years for each additional year since 1989 (95% CI: 0.29, 0.41; p < 0.05).
The main effect of jurisdiction was not statistically significant; there was insufficient evidence to conclude that the average exoneration time in 1989 differed between state and federal cases (ANOVA p = 0.18). However, a significant interaction between jurisdiction and time revealed that the annual rate of change in the average time to exoneration for state-level cases was 0.22 years less per year compared to federal cases (95% CI: -0.40, -0.04; p < 0.05).
3.2.6 Crime Type with Demographic Controls
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type_extended2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_crime_type_extended2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 9.947 | 0.597 | 3381 | 16.655 | 0.000 | 8.779 | 11.115 |
| years_since_1989 | 0.393 | 0.024 | 3381 | 16.704 | 0.000 | 0.347 | 0.439 |
| crime_typeSociety Crimes | -5.056 | 1.240 | 3381 | -4.078 | 0.000 | -7.480 | -2.632 |
| age | -0.150 | 0.015 | 3381 | -10.181 | 0.000 | -0.179 | -0.121 |
| raceWhite | -1.113 | 0.343 | 3381 | -3.247 | 0.001 | -1.783 | -0.443 |
| raceHispanic | -2.722 | 0.453 | 3381 | -6.011 | 0.000 | -3.607 | -1.836 |
| raceAsian | -4.613 | 1.495 | 3381 | -3.086 | 0.002 | -7.536 | -1.691 |
| sexFemale | -2.424 | 0.499 | 3381 | -4.858 | 0.000 | -3.400 | -1.448 |
| years_since_1989:crime_typeProperty Crimes | -0.188 | 0.092 | 3381 | -2.057 | 0.040 | -0.368 | -0.009 |
| years_since_1989:crime_typeWhite-collar Crimes | -0.232 | 0.113 | 3381 | -2.055 | 0.040 | -0.453 | -0.011 |
| years_since_1989:crime_typeSociety Crimes | -0.178 | 0.049 | 3381 | -3.633 | 0.000 | -0.274 | -0.082 |
Key Findings:
Significant interaction effects between crime type and time were observed. After adjusting for age at baseline, race, and sex, the estimated annual rate of change in the average time from initial conviction to exoneration for exonerees convicted of property crimes was 0.19 years less per year than for those convicted of crimes against people (95% CI: -0.368, -0.009; p = 0.040). Similarly, for white-collar crimes, the annual rate of change in the average time was 0.23 years less per year compared to crimes against people (95% CI: -0.453, -0.011; p = 0.040). Exonerees convicted of society crimes also experienced a slower increase in average exoneration time, with a rate 0.18 years less per year than that for crimes against people (95% CI: -0.274, -0.082; p < 0.001).
4 Discussion
The United States often identifies itself as the “Land of the Free,” yet since 1989, there have been over 3,000 exonerations in the country. Innocent individuals have been wrongfully convicted of crimes of varying severity. This alarming statistic reflects a significant loss of years, leading to profound emotional, physical, and social instability for many. By utilizing data from 3,425 exonerees documented in the National Registry of Exonerations, this project aimed to analyze how the duration between initial conviction and eventual exoneration has evolved in the United States, alongside the influence of various factors such as demographics, crime types, and case characteristics. The demographic factors considered included the age of the exonerees at the time of conviction, as well as their sex and race. Case characteristics examined consisted of the type of crime and the jurisdiction involved. By analyzing factors such as race, age, sex, crime type, and jurisdiction, we identified patterns that may influence the duration it takes wrongfully convicted individuals to achieve exoneration.
The cross-sectional exploratory analysis of the data revealed significant differences in the characteristics of exonerees. Specifically, individuals spent an average of 12.3 years from conviction to exoneration, with a mean age of 28.3 years at the time of conviction. Males accounted for over 90% of exonerations, particularly in cases involving crimes against people (93%) and justice system crimes (94%). The age group of 20-29 years old represented over 40% of cases, while Black individuals constituted 53% of exonerees, especially in society crimes (69%) and crimes against people (52%). Most exonerations occurred at the state level, with crimes against people representing over 72% of the total cases (2,508 in total). The time required for exoneration varied by crime type, averaging 14.34 years for crimes against people and 4.10 years for justice system crimes. White-collar crimes had a higher proportion of white defendants (75%) and were predominantly federal cases (69%).
Due to the longitudinal nature of the data, a more sophisticated analysis was required. We utilized various visualization techniques, including spaghetti plots and subject-specific charts, to explore the within- and between-state variability in the time to exoneration over the 35-year period since 1989. The data exhibited imbalanced and complex structures: some states provided numerous observations with clear temporal trends, while others offered as few as three observations throughout the entire study period. Furthermore, the overall mean plot of time to exoneration indicated an increasing trend over time, accompanied by fluctuations, while stratified plots based on demographic and case characteristics revealed distinct associations.
4.1 Key Findings
The longitudinal modelling of exoneration cases from 1989 onwards revealed significant trends and disparities in the time from initial conviction to exoneration in the United States. Over the past three decades, exoneration times have increased substantially, with an average annual rise of approximately 0.35 to 0.40 years across most demographic groups. Notably, Hispanic exonerees experienced significantly shorter initial exoneration times compared to Black exonerees. Additionally, the rate of increase in exoneration times varied by sex (slower for females), age group (slower for older individuals), crime type (slower increases for property crimes, white-collar crimes, and justice system offenses compared to crimes against people), and jurisdiction (slower increases for state versus federal cases). These trends suggest that while overall exoneration times are lengthening, the burden of these delays is not equally distributed across demographic groups, highlighting systemic disparities within the criminal justice system.
4.2 Methodological Differences
The analysis employed both Linear Mixed Models (LMM) and Generalized Estimating Equations (GEE), yielding some consistent and inconsistent findings. LMM provides interpretations that account for individual state-level variations, while GEE estimates effects across the entire population without focusing on state-by-state differences. These methodological distinctions mean that effect sizes and significance levels may differ between approaches, particularly when examining interaction effects. It is crucial to interpret the findings within the context of the specific modeling framework used.
4.3 Limitations
Several critical limitations affected the interpretation of the findings regarding wrongful convictions:
Selection Bias: The analysis is based on documented exonerations, likely overlooking many undocumented cases due to factors like insufficient resources and high evidentiary standards.
Uneven Sample Sizes: The varying sizes across demographic categories can lead to overestimation of effect sizes and impact the reliability of results, particularly for underrepresented groups.
Neglected Factors: Important influences on exoneration duration, such as false confessions and the advancements in DNA testing, were not accounted for in the analysis.
Overall, while the findings highlight trends in the exoneration process, recognizing these limitations is essential for guiding future research and advocacy on wrongful convictions.
Note
Grammarly contributed to this text by responding to these AI prompts:
Prompts I wrote:
- “make more academic”
- “Improve it”
- “Summarize it”
5 Appendix: Statistical Code
5.1 Model Setup and Comparison Functions
5.2 Sex Models
Code
# Linear Mixed Effects Models
mod_sex1 <- lme(time_to_exoneration ~ years_since_1989 * sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_sex2 <- lme(time_to_exoneration ~ years_since_1989 * sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_sex3 <- lme(time_to_exoneration ~ years_since_1989 * sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model
sex_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * sex,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.3 Sex Results Tables
Code
# Extract fixed effects summary
fixed_effects_df <- as.data.frame(summary(mod_sex2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
# Get confidence intervals
ci <- nlme::intervals(mod_sex2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("CI Lower", "CI Upper")
# Combine results
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
kable(fixed_effects_full, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | CI Lower | CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.259 | 0.472 | 3396 | 9.023 | 0.000 | 3.334 | 5.184 |
| years_since_1989 | 0.357 | 0.027 | 3396 | 13.183 | 0.000 | 0.304 | 0.410 |
| sexFemale | -0.196 | 1.409 | 3396 | -0.139 | 0.889 | -2.956 | 2.565 |
| years_since_1989:sexFemale | -0.187 | 0.060 | 3396 | -3.129 | 0.002 | -0.305 | -0.070 |
Code
tab_model(sex_mod_glm, title = "GEE Model - Sex as Predictor")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 3.84 | 2.45 – 5.23 | <0.001 |
| years since 1989 | 0.39 | 0.32 – 0.46 | <0.001 |
| sex [Female] | 0.52 | -2.09 – 3.13 | 0.696 |
| years since 1989 × sex [Female] |
-0.22 | -0.35 – -0.09 | 0.001 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.4 Race Models
Code
# Linear Mixed Effects Models
mod_race1 <- lme(time_to_exoneration ~ years_since_1989 * race,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_race2 <- lme(time_to_exoneration ~ years_since_1989 * race,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_race3 <- lme(time_to_exoneration ~ years_since_1989 * race,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model
race_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * race,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.5 Race Results Tables
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_race2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_race2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 5.270 | 0.630 | 3388 | 8.365 | 0.000 | 4.037 | 6.503 |
| years_since_1989 | 0.348 | 0.032 | 3388 | 10.888 | 0.000 | 0.286 | 0.411 |
| raceHispanic | -5.858 | 1.283 | 3388 | -4.565 | 0.000 | -8.369 | -3.346 |
| years_since_1989:raceHispanic | 0.180 | 0.054 | 3388 | 3.358 | 0.001 | 0.075 | 0.285 |
| years_since_1989:raceAsian | -0.545 | 0.242 | 3388 | -2.249 | 0.025 | -1.020 | -0.071 |
Code
tab_model(race_mod_glm, title = "GEE Model - Race as Predictor")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 4.86 | 3.08 – 6.63 | <0.001 |
| years since 1989 | 0.37 | 0.27 – 0.48 | <0.001 |
| race [White] | -0.09 | -1.90 – 1.73 | 0.927 |
| race [Hispanic] | -5.44 | -10.43 – -0.44 | 0.033 |
| race [Asian] | 5.29 | 0.60 – 9.98 | 0.027 |
| race [Native American] | 10.10 | 0.61 – 19.60 | 0.037 |
| race [Other] | -3.86 | -8.74 – 1.03 | 0.122 |
| years since 1989 × race [White] |
-0.09 | -0.21 – 0.02 | 0.120 |
| years since 1989 × race [Hispanic] |
0.16 | -0.12 – 0.43 | 0.259 |
| years since 1989 × race [Asian] |
-0.52 | -0.72 – -0.32 | <0.001 |
| years since 1989 × race [Native American] |
-0.38 | -0.86 – 0.11 | 0.125 |
| years since 1989 × race [Other] |
-0.04 | -0.33 – 0.25 | 0.793 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.6 Age Group Models
Code
# Linear Mixed Effects Models
mod_age_group1 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_age_group2 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_age_group3 <- lme(time_to_exoneration ~ years_since_1989 * age_group,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model
age_group_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * age_group,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.7 Age Group Results Tables
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_age_group2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_age_group2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.985 | 0.615 | 3390 | 8.106 | 0.000 | 3.781 | 6.189 |
| years_since_1989 | 0.372 | 0.030 | 3390 | 12.325 | 0.000 | 0.313 | 0.431 |
| years_since_1989:age_groupAdolescence (15–19) | 0.148 | 0.046 | 3390 | 3.213 | 0.001 | 0.058 | 0.238 |
| years_since_1989:age_groupMid Adulthood (30–39) | -0.086 | 0.043 | 3390 | -2.005 | 0.045 | -0.169 | -0.002 |
| years_since_1989:age_groupOlder Adulthood (40+) | -0.237 | 0.048 | 3390 | -4.961 | 0.000 | -0.330 | -0.143 |
Code
tab_model(age_group_mod_glm, title = "GEE Model - Age Group as Predictor")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 4.78 | 3.28 – 6.28 | <0.001 |
| years since 1989 | 0.39 | 0.30 – 0.47 | <0.001 |
| age group [Childhood (0–14)] |
3.56 | -10.31 – 17.43 | 0.615 |
| age group [Adolescence (15–19)] |
-2.32 | -5.22 – 0.58 | 0.117 |
| age group [Mid Adulthood (30–39)] |
-0.49 | -1.99 – 1.01 | 0.523 |
| age group [Older Adulthood (40+)] |
-0.88 | -3.08 – 1.33 | 0.437 |
| years since 1989 × age group [Childhood (0–14)] |
-0.14 | -0.85 – 0.57 | 0.704 |
| years since 1989 × age group [Adolescence (15–19)] |
0.16 | 0.05 – 0.28 | 0.005 |
| years since 1989 × age group [Mid Adulthood (30–39)] |
-0.09 | -0.16 – -0.01 | 0.031 |
| years since 1989 × age group [Older Adulthood (40+)] |
-0.25 | -0.40 – -0.10 | 0.001 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.8 Crime Type Models
Code
# Linear Mixed Effects Models
mod_crime_type1 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_crime_type2 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_crime_type3 <- lme(time_to_exoneration ~ years_since_1989 * crime_type,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model
crime_type_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * crime_type,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.9 Crime Type Results Tables
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_crime_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.452 | 0.431 | 3388 | 10.340 | 0.000 | 3.609 | 5.294 |
| years_since_1989 | 0.404 | 0.026 | 3388 | 15.682 | 0.000 | 0.353 | 0.454 |
| crime_typeSociety Crimes | -6.044 | 1.258 | 3388 | -4.802 | 0.000 | -8.507 | -3.580 |
| years_since_1989:crime_typeProperty Crimes | -0.209 | 0.094 | 3388 | -2.221 | 0.026 | -0.393 | -0.025 |
| years_since_1989:crime_typeWhite-collar Crimes | -0.310 | 0.116 | 3388 | -2.683 | 0.007 | -0.537 | -0.084 |
| years_since_1989:crime_typeSociety Crimes | -0.165 | 0.050 | 3388 | -3.308 | 0.001 | -0.262 | -0.067 |
| years_since_1989:crime_typeJustice System Crimes | -0.395 | 0.198 | 3388 | -1.991 | 0.047 | -0.782 | -0.007 |
Code
tab_model(crime_type_mod_glm, title = "GEE Model - Crime Type as Predictor")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 3.19 | 2.20 – 4.18 | <0.001 |
| years since 1989 | 0.47 | 0.42 – 0.51 | <0.001 |
| crime type [Property Crimes] |
-3.70 | -6.25 – -1.15 | 0.004 |
| crime type [White-collar Crimes] |
-3.04 | -5.83 – -0.26 | 0.032 |
| crime type [Society Crimes] |
-6.64 | -11.34 – -1.94 | 0.006 |
| crime type [Justice System Crimes] |
-1.47 | -5.22 – 2.28 | 0.442 |
| crime type [Other Crimes] | -2.60 | -8.01 – 2.80 | 0.345 |
| years since 1989 × crime type [Property Crimes] |
-0.20 | -0.36 – -0.04 | 0.013 |
| years since 1989 × crime type [White-collar Crimes] |
-0.31 | -0.51 – -0.11 | 0.002 |
| years since 1989 × crime type [Society Crimes] |
-0.13 | -0.41 – 0.15 | 0.358 |
| years since 1989 × crime type [Justice System Crimes] |
-0.41 | -0.56 – -0.26 | <0.001 |
| years since 1989 × crime type [Other Crimes] |
-0.33 | -0.57 – -0.09 | 0.007 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.10 Jurisdiction Models
Code
# Linear Mixed Effects Models
mod_jurisdiction_type1 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_jurisdiction_type2 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_jurisdiction_type3 <- lme(time_to_exoneration ~ years_since_1989 * jurisdiction,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989| corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model
jurisdiction_mod_glm <- glmgee(time_to_exoneration ~ years_since_1989 * jurisdiction,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.11 Jurisdiction Results Tables
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_jurisdiction_type2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_jurisdiction_type2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 4.433 | 0.487 | 3396 | 9.110 | 0.000 | 3.480 | 5.387 |
| years_since_1989 | 0.347 | 0.030 | 3396 | 11.634 | 0.000 | 0.288 | 0.405 |
| years_since_1989:jurisdictionFederal | -0.223 | 0.091 | 3396 | -2.444 | 0.015 | -0.402 | -0.044 |
Code
tab_model(jurisdiction_mod_glm, title = "GEE Model - Jurisdiction as Predictor")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 4.12 | 2.65 – 5.60 | <0.001 |
| years since 1989 | 0.37 | 0.30 – 0.45 | <0.001 |
| jurisdiction [Federal] | -3.63 | -6.88 – -0.38 | 0.028 |
| years since 1989 × jurisdiction [Federal] |
-0.15 | -0.39 – 0.09 | 0.224 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.12 Crime Type with Demographic Controls
Code
# Linear Mixed Effects Models with controls
mod_crime_type_extended1 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_crime_type_extended2 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989 | corrected_state, pdClass = "pdDiag", REML = FALSE))
mod_crime_type_extended3 <- lme(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
data = longitudinal_data_clean, method = "ML",
random = reStruct(~1 + years_since_1989| corrected_state, pdClass = "pdSymm", REML = FALSE))
# GEE Model with controls
crime_type_extended_glm <- glmgee(time_to_exoneration ~ years_since_1989 * crime_type + age + race + sex,
data = longitudinal_data_clean,
id = corrected_state,
corstr = "Exchangeable")5.13 Crime Type Extended Results Tables
Code
# Extract and process results
fixed_effects_df <- as.data.frame(summary(mod_crime_type_extended2)$tTable)
colnames(fixed_effects_df) <- c("Estimate", "Std. Error", "DF", "t-value", "p-value")
ci <- nlme::intervals(mod_crime_type_extended2, which = "fixed")$fixed
ci_df <- as.data.frame(ci)[, c("lower", "upper")]
colnames(ci_df) <- c("95% CI Lower", "95% CI Upper")
fixed_effects_full <- cbind(fixed_effects_df, ci_df)
significant_effects <- fixed_effects_full[fixed_effects_full$`p-value` < 0.05, ]
kable(significant_effects, digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
font_size = 10,
full_width = FALSE,
position = "center")| Estimate | Std. Error | DF | t-value | p-value | 95% CI Lower | 95% CI Upper | |
|---|---|---|---|---|---|---|---|
| (Intercept) | 9.947 | 0.597 | 3381 | 16.655 | 0.000 | 8.779 | 11.115 |
| years_since_1989 | 0.393 | 0.024 | 3381 | 16.704 | 0.000 | 0.347 | 0.439 |
| crime_typeSociety Crimes | -5.056 | 1.240 | 3381 | -4.078 | 0.000 | -7.480 | -2.632 |
| age | -0.150 | 0.015 | 3381 | -10.181 | 0.000 | -0.179 | -0.121 |
| raceWhite | -1.113 | 0.343 | 3381 | -3.247 | 0.001 | -1.783 | -0.443 |
| raceHispanic | -2.722 | 0.453 | 3381 | -6.011 | 0.000 | -3.607 | -1.836 |
| raceAsian | -4.613 | 1.495 | 3381 | -3.086 | 0.002 | -7.536 | -1.691 |
| sexFemale | -2.424 | 0.499 | 3381 | -4.858 | 0.000 | -3.400 | -1.448 |
| years_since_1989:crime_typeProperty Crimes | -0.188 | 0.092 | 3381 | -2.057 | 0.040 | -0.368 | -0.009 |
| years_since_1989:crime_typeWhite-collar Crimes | -0.232 | 0.113 | 3381 | -2.055 | 0.040 | -0.453 | -0.011 |
| years_since_1989:crime_typeSociety Crimes | -0.178 | 0.049 | 3381 | -3.633 | 0.000 | -0.274 | -0.082 |
Code
tab_model(crime_type_extended_glm, title = "GEE Model - Crime Type with Controls")| time to exoneration | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | 9.07 | 7.33 – 10.82 | <0.001 |
| years since 1989 | 0.44 | 0.40 – 0.48 | <0.001 |
| crime type [Property Crimes] |
-2.50 | -5.77 – 0.77 | 0.134 |
| crime type [White-collar Crimes] |
-1.35 | -4.49 – 1.79 | 0.398 |
| crime type [Society Crimes] |
-5.76 | -10.54 – -0.98 | 0.018 |
| crime type [Justice System Crimes] |
-0.06 | -5.13 – 5.00 | 0.980 |
| crime type [Other Crimes] | -1.61 | -6.60 – 3.38 | 0.527 |
| age | -0.15 | -0.21 – -0.09 | <0.001 |
| race [White] | -1.15 | -2.00 – -0.29 | 0.008 |
| race [Hispanic] | -2.72 | -4.27 – -1.16 | 0.001 |
| race [Asian] | -4.63 | -7.09 – -2.16 | <0.001 |
| race [Native American] | 0.38 | -2.96 – 3.72 | 0.823 |
| race [Other] | -1.67 | -4.30 – 0.96 | 0.213 |
| sex [Female] | -2.43 | -3.24 – -1.61 | <0.001 |
| years since 1989 × crime type [Property Crimes] |
-0.18 | -0.38 – 0.01 | 0.069 |
| years since 1989 × crime type [White-collar Crimes] |
-0.24 | -0.43 – -0.04 | 0.016 |
| years since 1989 × crime type [Society Crimes] |
-0.14 | -0.40 – 0.12 | 0.281 |
| years since 1989 × crime type [Justice System Crimes] |
-0.36 | -0.56 – -0.15 | 0.001 |
| years since 1989 × crime type [Other Crimes] |
-0.28 | -0.49 – -0.08 | 0.006 |
| N corrected_state | 51 | ||
| Observations | 3450 | ||
5.14 Model Comparison Tables
Code
kable(compare_sex, caption = "Model Comparison for Sex", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)| CIC.Object | CIC.Correlation | CIC.CIC | QIC | GHYC | RJC | AGPC | SGPC | |
|---|---|---|---|---|---|---|---|---|
| Independence | m_indep | Independence | 21.613 | 3489.226 | 109768.4 | 84.800 | Inf | Inf |
| Exchangeable | m_exch | Exchangeable | 14.212 | 3474.423 | 110649.3 | 4.355 | Inf | Inf |
| AR(1) | m_ar1 | AR-M-dependent(1) | 21.685 | 3489.370 | 107943.5 | 45.555 | Inf | Inf |
| AR(2) | m_ar2 | AR-M-dependent(2) | 21.569 | 3489.138 | 106931.0 | 25.446 | Inf | Inf |
| AR(3) | m_ar3 | AR-M-dependent(3) | 21.298 | 3488.596 | 105943.8 | 17.714 | Inf | Inf |
Code
kable(compare_race, caption = "Model Comparison for Race", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)| CIC.Object | CIC.Correlation | CIC.CIC | QIC | GHYC | RJC | AGPC | SGPC | |
|---|---|---|---|---|---|---|---|---|
| Independence | m_indep | Independence | 42.814 | 3523.627 | 112962.1 | 55.583 | Inf | Inf |
| Exchangeable | m_exch | Exchangeable | 34.660 | 3507.321 | 111271.7 | 15.681 | Inf | Inf |
| AR(1) | m_ar1 | AR-M-dependent(1) | 40.896 | 3519.792 | 109605.1 | 35.106 | Inf | Inf |
| AR(2) | m_ar2 | AR-M-dependent(2) | 38.887 | 3515.774 | 107192.0 | 22.033 | Inf | Inf |
| AR(3) | m_ar3 | AR-M-dependent(3) | 38.731 | 3515.462 | 105896.7 | 18.667 | Inf | Inf |
Code
kable(compare_age_group, caption = "Model Comparison for Age Group", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)| CIC.Object | CIC.Correlation | CIC.CIC | QIC | GHYC | RJC | AGPC | SGPC | |
|---|---|---|---|---|---|---|---|---|
| Independence | m_indep | Independence | 34.852 | 3509.704 | 106912.2 | 45.185 | Inf | Inf |
| Exchangeable | m_exch | Exchangeable | 27.830 | 3495.660 | 107946.9 | 11.371 | Inf | Inf |
| AR(1) | m_ar1 | AR-M-dependent(1) | 34.765 | 3509.530 | 105070.5 | 30.628 | Inf | Inf |
| AR(2) | m_ar2 | AR-M-dependent(2) | 34.635 | 3509.270 | 103519.8 | 21.663 | Inf | Inf |
| AR(3) | m_ar3 | AR-M-dependent(3) | 34.698 | 3509.395 | 102843.7 | 18.645 | Inf | Inf |
Code
kable(compare_crime_type, caption = "Model Comparison for Crime Type", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)| CIC.Object | CIC.Correlation | CIC.CIC | QIC | GHYC | RJC | AGPC | SGPC | |
|---|---|---|---|---|---|---|---|---|
| Independence | m_indep | Independence | 54.920 | 3547.840 | 102634.43 | 154.970 | Inf | Inf |
| Exchangeable | m_exch | Exchangeable | 47.972 | 3533.948 | 116496.69 | 55.650 | Inf | Inf |
| AR(1) | m_ar1 | AR-M-dependent(1) | 53.842 | 3545.684 | 102273.54 | 112.370 | Inf | Inf |
| AR(2) | m_ar2 | AR-M-dependent(2) | 49.747 | 3537.494 | 100264.85 | 68.746 | Inf | Inf |
| AR(3) | m_ar3 | AR-M-dependent(3) | 49.069 | 3536.137 | 99260.09 | 58.862 | Inf | Inf |
Code
kable(compare_jurisdiction, caption = "Model Comparison for Jurisdiction", digits = 3) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 8)| CIC.Object | CIC.Correlation | CIC.CIC | QIC | GHYC | RJC | AGPC | SGPC | |
|---|---|---|---|---|---|---|---|---|
| Independence | m_indep | Independence | 34.415 | 3514.830 | 110907.9 | 162.402 | Inf | Inf |
| Exchangeable | m_exch | Exchangeable | 19.914 | 3485.827 | 112274.3 | 9.517 | Inf | Inf |
| AR(1) | m_ar1 | AR-M-dependent(1) | 31.405 | 3508.810 | 108074.3 | 78.460 | Inf | Inf |
| AR(2) | m_ar2 | AR-M-dependent(2) | 29.710 | 3505.419 | 107018.0 | 38.916 | Inf | Inf |
| AR(3) | m_ar3 | AR-M-dependent(3) | 28.648 | 3503.295 | 106027.2 | 26.197 | Inf | Inf |